//
// Created by 2592345590 on 2022/5/11.
//

#ifndef WORKPLACE_GANALYSIS_H
#define WORKPLACE_GANALYSIS_H
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
//语法分析 LL方法
class GAnalysis {
public:
    vector<string> noTerminator;//非终结符集合 U T E
    vector<vector<string> > noTerminatorChild;//非终结符候选式 U->a|aU|n(空)
    vector<vector<string> > first;//First集
    vector<vector<string> > follow;//Follow集
    vector<vector<vector<string> > > select;//select集 也就是 S->TF (S->TF)={} 也就是预测分析表
    vector<string> Terminator;//终结符存储
public:
    GAnalysis();
    void Print();//输出当前文法
    void PrintFirst();//打印first集合
    void PrintFollow();
    void PrintSelect();
    void PrintStack(stack<string> data);
    void RmLRecursion();//消除左递归 remove left recursion
    void RmLDRecursion();//消除直接左递归 remove left direct recursion
    void RmLIRecursion();//消除间接左递归 remove left indirect recursion
    void First();//构造First集
    vector<string> GetFirst(int x);
    void Follow();//构造Follow集
    void Select();
    bool Analysis(string input);//递归下降分析
    void AddWord(string str);
private:
    string null;
    virtual string GetStringFirst(string str, bool *pBoolean, int *pInt);
    void AddFirst(int x,vector<string> str);
    virtual string GetNextWord(string input,int *len);
};


#endif //WORKPLACE_GANALYSIS_H
